package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.entrega1;

import junit.framework.Assert;
import org.uqbar.commons.utils.ApplicationContext;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Categoria;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Evasor;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.InfractorFrecuente;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Inhabilitado;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.externos.VerificadorDePagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCategorias;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.*;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionMail;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionSMS;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.vehiculos.Vehiculo;

public class Punto2TestCase {
	
	public Vehiculo unVehiculo;
	public AdministradorCategorias adCat;
	public Captura unaCaptura;
	public Captura otraCaptura;
	public Categoria evasor;
	public Categoria inhabilitado;
	public Categoria iFrecuente;


	@Before
	public void setUp(){
		
		Zona zona1 = new Zona("Zona Roja", "1552478536");		
		Zona zona2 = new Zona("Zona Verde", "1554714585");		
		TipoInfraccion unaInfraccion = new TipoInfraccion("Cruzar en Rojo", 50, 1000);		
		TipoInfraccion otraInfraccion= new TipoInfraccion("Mal estacionado", 60, 10);		
		Image unaFotito = new Image();
		Image otraFotito = new Image();
		unaCaptura= new Captura(zona2, unaInfraccion, otraFotito, new DateTime());
		otraCaptura = new Captura(zona1, otraInfraccion, unaFotito, new DateTime());
		
		// Configuracion de las Categorias
		ApplicationContext.getInstance().configureSingleton(AdministradorCategorias.class, new AdministradorCategorias());
		adCat = ApplicationContext.getInstance().getSingleton(AdministradorCategorias.class);

		//adCat = new AdministradorCategorias();
		//VerificadorDePagos verificadorDePagos = new VerificadorPagos();
		ApplicationContext.getInstance().configureSingleton(VerificadorDePagos.class, new VerificadorPagos());
		
		//unVehiculo = new Vehiculo("ZZZ 515", adCat, verificadorDePagos);
		unVehiculo = new Vehiculo("ZZZ 515");
		
		evasor = new Evasor();
		inhabilitado = new Inhabilitado();
		iFrecuente = new InfractorFrecuente();
		
		MailSender unMailSender = new MailSender();
		
		NotificacionMail notificacionEvasor = new NotificacionMail(unMailSender);
		notificacionEvasor.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionEvasor.setDireccion("capturanus@afip.gob.ar");
		
		NotificacionSMS notificacionInhabilitado = new NotificacionSMS(new SMSSender());
		
		evasor.setNotificacion(notificacionEvasor);
		inhabilitado.setNotificacion(notificacionInhabilitado);
		
		adCat.addCategoria(evasor);
		adCat.addCategoria(inhabilitado);
		adCat.addCategoria(iFrecuente);

	}
	
	@Test
	public void verificarCategoriaInhabilitado(){
	
		unVehiculo.addCaptura(otraCaptura);	
		Assert.assertFalse(unVehiculo.estaEnLaCategoria(inhabilitado));
		
		unVehiculo.addCaptura(unaCaptura);
		Assert.assertTrue(unVehiculo.estaEnLaCategoria(inhabilitado));
	}

	@Test
	public void verificarCategoriaEvasor(){
		
		unVehiculo.addCaptura(otraCaptura);
		Assert.assertFalse(unVehiculo.estaEnLaCategoria(evasor));
		
		unVehiculo.addCaptura(unaCaptura);
		Assert.assertTrue(unVehiculo.estaEnLaCategoria(evasor));		
	}
	
	
	@Test
	public void verificarCategoriaFreacuente(){
			
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		
		Assert.assertFalse(unVehiculo.estaEnLaCategoria(iFrecuente));
		
		unVehiculo.addCaptura(otraCaptura);
		
		Assert.assertTrue(unVehiculo.estaEnLaCategoria(iFrecuente));		
	}	
	
	@Test
	public void verificarNoDuplicacionCategorias(){
		
		Assert.assertTrue(unVehiculo.getCategorias().size() == 0);
		
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(otraCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(unaCaptura);
		unVehiculo.addCaptura(unaCaptura);
		
		Assert.assertTrue(unVehiculo.estaEnLaCategoria(evasor));
		Assert.assertTrue(unVehiculo.estaEnLaCategoria(iFrecuente));
		Assert.assertTrue(unVehiculo.estaEnLaCategoria(inhabilitado));
		
		Assert.assertTrue(unVehiculo.getCategorias().size() == 3);
		System.out.println("catidad de categorias "+ unVehiculo.getCategorias().size());
	}
}